home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1996 #6
/
Amiga Plus CD - 1996 - No. 06.iso
/
pd
/
programmierung
/
proasm
/
routines
/
conreadpkt.r
< prev
next >
Wrap
Text File
|
1993-04-04
|
5KB
|
306 lines
;---; conreadpkt.r ;---------------------------------------------------------
*
* **** CONSOLE READING BY SENDING PACKETS ****
*
* Author Stefan Walter
* Version 1.01
* Last Revision 04.04.93
* Identifier crp_defined
* Prefix crp_ (console read with packets)
* ¯ ¯ ¯
* Functions InitConRead, ResetConRead, SendConRead, ExaminePacket
*
* NOTE: These routines have been collected because AmigaDOS does not
* provide comfortable read functions which can wait on additional
* signals.
*
;------------------------------------------------------------------------------
;------------------
ifnd crp_defined
crp_defined =1
;------------------
crp_oldbase equ __base
base crp_base
crp_base:
;------------------
;------------------------------------------------------------------------------
*
* InitConRead Initialize packet sending. Open port and get packet.
*
* INPUT d0 CON handle.
*
* RESULT: d0 Packet or 0.
* ccr On d0.
*
;------------------------------------------------------------------------------
;------------------
InitConRead:
;------------------
; Start.
;
\start:
movem.l d1-a6,-(sp)
lea crp_base(pc),a4
lsl.l #2,d0
move.l d0,crp_handle(a4)
;------------------
; Get port.
;
\openport:
lea crp_port(pc),a0
bsr MakePort
beq.s \done
;------------------
; Get packet.
;
\getpacket:
bsr AllocPacket
beq.s \error
move.l d0,crp_packet(a4)
clr.b crp_sent(a4) ;no packet on the way
clr.w crp_offset(a4)
bra.s \done
;------------------
; Error => close port.
;
\error:
lea crp_port(pc),a0
bsr UnMakePort
moveq #0,d0
;------------------
; Done.
;
\done:
tst.l d0
movem.l (sp)+,d1-a6
rts
;------------------
;------------------------------------------------------------------------------
*
* SendConRead Send the read packet if it's not on the way. A read with length
* 1 is sent, ExaminePacket will read a line using this.
*
* RESULT: d0 -1 if okay, 0 if packet already on the way.
* ccr On d0.
*
;------------------------------------------------------------------------------
;------------------
SendConRead:
;------------------
; Start.
;
\start:
movem.l d1-a6,-(sp)
lea crp_base(pc),a4
moveq #0,d0
tst.b crp_sent(a4)
bne.s \done
;------------------
; Fill in packet.
;
\fill:
move.l crp_packet(pc),a0
pea crp_temp(pc)
moveq #82,d3
move.l d3,8(a0) ;READ!
move.l (sp)+,24(a0) ;Buffer
moveq #1,d3
move.l d3,28(a0) ;Length
move.l crp_handle(pc),a1
move.l 36(a1),20(a0) ;Arg1 from filehandle
;------------------
; Send packet.
;
\send:
move.l a0,d1
move.l 8(a1),d2 ;port of CON:
pea crp_port(pc)
move.l (sp)+,d3
bsr SendPacket
st.b crp_sent(a4)
moveq #-1,d0
;------------------
; Done.
;
\done:
tst.l d0
movem.l (sp)+,d1-a6
rts
;------------------
;------------------------------------------------------------------------------
*
* ResetConRead Reset packet sending. Free dos object and remove port.
*
;------------------------------------------------------------------------------
;------------------
ResetConRead:
;------------------
; Start.
;
\start:
movem.l d0-a6,-(sp)
move.l crp_packet(pc),d0 ;no packet installed?
beq.s \exit
move.b crp_sent(pc),d0 ;is it on the way?
beq.s \nowait
pea crp_port(pc)
move.l (sp)+,d0
bsr WaitForPacket
\nowait:
move.l crp_packet(pc),d0
bsr FreePacket
lea crp_port(pc),a0
bsr UnMakePort
;------------------
; exit
;
\exit:
movem.l (sp)+,d0-a6
rts
;------------------
;------------------------------------------------------------------------------
*
* ExaminePacket Wait for our packet to return and get all text until the next
* CR to the buffer.
*
* RESULT: a0 Text if d0>=0, zeroterminated.
* d0 Length (a0+d0=pointer on zero), -1 if EOF
* ccr On d0.
*
;------------------------------------------------------------------------------
;------------------
ExaminePacket:
;------------------
; Start.
;
\start:
movem.l d1-d7/a1-a6,-(sp)
;------------------
; Loop.
;
\loop:
pea crp_port(pc)
move.l (sp)+,d0
bsr WaitForPacket
lea crp_sent(pc),a1
clr.b (a1)
;------------------
; Get that damn Packet.
;
\packet:
move.l d0,a1
move.l 24(a1),a0
move.l 12(a1),d0
beq.s \close
move.b (a0),d1
lea crp_buffer(pc),a0
moveq #0,d0
lea crp_offset(pc),a2
move.w (a2),d0
cmp.b #$a,d1
beq.s \cr
cmp.w #200,d0
beq.s \no
move.b d1,(a0,d0)
addq.w #1,d0
\no:
move.w d0,(a2)
bsr SendConRead
bra.s \loop
;------------------
; This one was CR.
;
\cr:
clr.w (a2) ;clear offset for next line
clr.b (a0,d0)
tst.w d0
bra.s \done
;------------------
; Close gadget hit...
;
\close:
moveq #-1,d0
;------------------
; Done.
;
\done:
movem.l (sp)+,d1-d7/a1-a6
rts
;------------------
;--------------------------------------------------------------------
;------------------
include doslib.r
include ports.r
include structs.r
include packets.r
;------------------
; The port.
;
crp_port PortStruct_
;------------------
; Data.
;
crp_packet: dc.l 0
crp_sent: dc.b 0
crp_temp: dc.b 0
crp_offset: dc.w 0
crp_handle: dc.l 0
ifd cio_readbuffer
crp_buffer equ cio_readbuffer
else
crp_buffer: ds.b 202,0
endif
;------------------
;--------------------------------------------------------------------
;------------------
base crp_oldbase
;------------------
endif
end